package Servicios;

import java.util.List;

import Negocio.NovedadesVehiculo;
import Negocio.Vehiculo;
import Persistencia.IRepository;
import Persistencia.QueryParameter;
import Persistencia.Repository;
import Persistencia.RepositoryException;


/**
 * DAO de Vehiculos (Singleton)
 * Esta clase se encarga de brindar las funciones necesarias para manejar los <b>Vehiculos</b> en la base de datos.
 * Podremos obtener todos los vehiculos, un vehiculo en particular, guardar o actualizar un vehicuo y eliminar un vehiculo.
 *
 */
public class ServicioVehiculos {
	private IRepository<Vehiculo> repositorioVehiculos;
	private static ServicioVehiculos instance = null;
	
	private ServicioVehiculos() {
		this.repositorioVehiculos = new Repository<Vehiculo>();
	}
	
	public static ServicioVehiculos getInstance() {
		if (instance == null) {
			instance = new ServicioVehiculos();
		}
		return instance;
	}
	
	/**
	 * Funcion que retorna todos los vehiculos de la base de datos
	 * @return List<Vehiculo> vehiculos
	 * @throws ServiceException
	 */
	public List<Vehiculo> getVehiculos() throws ServiceException {
		List<Vehiculo> vehiculos;
		
		try {
			vehiculos = this.repositorioVehiculos.getAll(Vehiculo.class);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}	
		
		return vehiculos;
	}
	
	public static void main(String[] args) throws ServiceException {
		List<Vehiculo> vehiculos = ServicioVehiculos.getInstance().getVehiculos();
		for (Vehiculo vehiculo : vehiculos) {
			System.out.println(vehiculo.getDominio());
			List<NovedadesVehiculo> novedades = vehiculo.getNovedades();
			for (NovedadesVehiculo novedadesVehiculo : novedades) {
				System.out.println(novedadesVehiculo.getDescripcion());
			}
		}
	}
	
	/**
	 * Se crea el vehiculo en caso de que el mismo no exista en la base de datos, de existir se realiza una actualizacion.
	 * @param Vehiculo vehiculo
	 * @throws ServiceException
	 */
	public void guardarOActualizar(Vehiculo vehiculo) throws ServiceException {
		try {
			this.repositorioVehiculos.saveOrUpdate(vehiculo);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	
	public Vehiculo getVehiculo(String dominio) throws RepositoryException {
		String queryExpression = "from Vehiculo c where c.dominio = :dominio";
		QueryParameter parameter = new QueryParameter("dominio", dominio);
		Vehiculo vehiculo = this.repositorioVehiculos.get(queryExpression, parameter);
		
		return vehiculo;
	}
	
	

	public Boolean existeVehiculo(String vehiculoId) throws RepositoryException {
		return this.getVehiculo(vehiculoId) != null;
	}

	/**
	 * Funcion para eliminar un vehiculo de la base de datos
	 * @param Vehiculo vehiculo
	 * @throws RepositoryException
	 */
	public void eliminarVehiculo(Vehiculo vehiculo) throws RepositoryException {
		this.repositorioVehiculos.delete(vehiculo);
	}

}
